home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE FileNames;⓪ (*$Y+, L-*)⓪ ⓪ (*⓪!03.12.90 Fehler bei SplitName behoben, so daß nun kein Fehler mehr mit⓪+68020 passieren dürfte. (D0 war bei CopyA0OnStack-Aufruf um⓪+eins zu hoch, was ggf. ein Byte zuviel kopierte und damit den⓪+Stack überschrieb).⓪!31.01.91 ValidatePath verwendet "fileUpper" statt Strings.Upper⓪!29.03.93 StrToDrv erlaubt nun Drives v. A-Z (bisher A-P)⓪ *)⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, ADR, TSIZE, BYTE, WORD, LONGWORD;⓪ IMPORT Strings;⓪ FROM MOSGlobals IMPORT FileStr, PathStr, DriveStr, NameStr, SfxStr, PfxStr,⓪(OutOfStack, StringOverflow, fNotDeleted, fPathNotFound, fFileNotFound,⓪(Drive, DriveSet;⓪ ⓪ CONST drvZ = 26;⓪ ⓪ VAR strok: BOOLEAN;⓪ ⓪ ⓪ PROCEDURE fileUpper (VAR s: ARRAY OF CHAR);⓪"(* "Upper" für Dateinamen: berücksichtigt nur die unteren 128 Zeichen *)⓪"VAR n: CARDINAL;⓪"BEGIN⓪$(*⓪$FOR n:= 0 TO HIGH (s) DO⓪&IF s[n]='' THEN RETURN END;⓪&IF s[n]<CHR(128) THEN s[n]:=CAP(s[n]) END⓪$END⓪$*)⓪$ASSEMBLER⓪(MOVE.W -(A3),D1⓪(MOVE.L -(A3),A1⓪(CLR.W D0⓪&luup:⓪(MOVE.B (A1)+,D0⓪(BEQ ende⓪(BMI next⓪(JSR @CAP ;/A2⓪(MOVE.B D0,-1(A1)⓪&next:⓪(DBRA D1,luup⓪&ende:⓪$END⓪"END fileUpper;⓪ ⓪ ⓪ PROCEDURE copyA0OnStack;⓪"(*⓪#* Kopiert String in A0/D0.W auf Stack und korrigiert A0⓪#*)⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L (A7)+,(A3)+ ; Rücksprung-Adr retten⓪(MOVE.L A1,(A3)+ ; A1 retten⓪(MOVE.W D0,(A3)+ ; D0 retten⓪(ADDQ #2,D0 ; wichtig: es muß mind. -2- sein!⓪(BCLR #0,D0 ; SYNC D0⓪(SUBA.W D0,A7⓪(CMPA.L A3,A7⓪(BCC N⓪(TRAP #6⓪(DC.W OutOfStack⓪&N MOVE.L A7,A1⓪(MOVE.W -2(A3),D0⓪&L MOVE.B (A0)+,(A1)+⓪(DBEQ D0,L⓪(MOVE.L A7,A0⓪(MOVE.W -(A3),D0⓪(MOVE.L -(A3),A1⓪(MOVE.L -(A3),-(A7) ; und Rücksprung⓪$END⓪"END copyA0OnStack;⓪ ⓪ PROCEDURE ConcatName (REF prefix, suffix: ARRAY OF CHAR; VAR name: ARRAY OF CHAR);⓪"(*$L+*)⓪"VAR s1, s2: SfxStr; n1: NameStr; app: BOOLEAN;⓪"BEGIN⓪$(* aufpassen, da 'prefix'/'suffix' mit 'name' identisch sein können! *)⓪$app:= suffix[0] # 0C;⓪$IF app THEN⓪&Strings.Copy (suffix, Strings.Pos ('.', suffix, 0) + 1, 3, s1, strok);⓪$END;⓪$SplitPath (prefix, name, n1);⓪$SplitName (n1, n1, s2);⓪$Strings.Append (n1, name, strok);⓪$IF app THEN⓪&Strings.Append ('.', name, strok);⓪&Strings.Append (s1, name, strok);⓪$END;⓪"END ConcatName;⓪"(*$L=*)⓪ ⓪ PROCEDURE ConcatPath (REF path, name: ARRAY OF CHAR; VAR fullname: ARRAY OF CHAR);⓪"(*$L+*)⓪"VAR p1: PathStr; n2, n1: NameStr;⓪"BEGIN⓪$(* aufpassen, da 'path'/'name' mit 'fullName' identisch sein können! *)⓪$SplitPath (name, p1, n1);⓪$SplitPath (path, fullname, n2);⓪$Strings.Append (n1, fullname, strok);⓪"END ConcatPath;⓪"(*$L=*)⓪ ⓪ PROCEDURE NameConc ( REF prefix, suffix: ARRAY OF CHAR ): FileStr;⓪"(*$L+*)⓪"VAR n1: FileStr;⓪"BEGIN⓪$ConcatName (prefix, suffix, n1);⓪$RETURN n1⓪"END NameConc;⓪"(*$L=*)⓪ ⓪ PROCEDURE PathConc ( REF path, name: ARRAY OF CHAR ): FileStr;⓪"(*$L+*)⓪"VAR p1: FileStr;⓪"BEGIN⓪$ConcatPath (path, name, p1);⓪$RETURN p1⓪"END PathConc;⓪"(*$L=*)⓪ ⓪ PROCEDURE SplitName ( REF source: ARRAY OF CHAR; VAR prfx, sfx: ARRAY OF CHAR );⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(⓪(MOVE -(A3),D2⓪(MOVE.L -(A3),A2 ; sfx⓪(MOVE -(A3),D1⓪(MOVE.L -(A3),A1 ; prfx⓪(MOVE -(A3),D0⓪(MOVE.L -(A3),A0 ; source⓪(⓪(CMPA.L A2,A0⓪(BNE a2NotEqu⓪(JSR copyA0OnStack⓪(BRA a1NotEqu⓪&a2NotEqu⓪(CMPA.L A1,A0⓪(BNE a1NotEqu⓪(JSR copyA0OnStack⓪&a1NotEqu⓪(⓪(ADDQ #1,D0⓪(MOVE D3,-(A7)⓪(⓪(; Fehler melden, wenn 'prfx' zu klein⓪(CMPI #7,D1⓪(BEQ OK1⓪(BHI OK2⓪(TRAP #6⓪(DC.W StringOverflow-$4000 ; callerCaused⓪(ADDQ #1,D1⓪(BRA OK3⓪&OK2:⓪(CLR.B 8(A1)⓪&OK1:⓪(MOVEQ #8,D1⓪&OK3:⓪(⓪(; Fehler melden, wenn 'sfx' zu klein⓪(CMPI #2,D2⓪(BEQ OK4⓪(BHI OK5⓪(TRAP #6⓪(DC.W StringOverflow⓪(ADDQ #1,D2⓪(BRA OK6⓪&OK5:⓪(CLR.B 3(A2)⓪&OK4:⓪(MOVEQ #3,D2⓪&OK6:⓪(⓪&L1:⓪(SUBQ #1,D0⓪(BCS EMPTY⓪(MOVE.B (A0)+,D3⓪(BEQ EMPTY⓪(CMPI.B #'.',D3⓪(BEQ POINT⓪(SUBQ #1,D1⓪(BMI L1⓪(MOVE.B D3,(A1)+⓪(BRA L1⓪(⓪&POINT:⓪(SUBQ #1,D0⓪(BCS EMPTY⓪(MOVE.B (A0)+,D3⓪(BEQ EMPTY⓪(SUBQ #1,D2⓪(BCS EMPTY⓪(MOVE.B D3,(A2)+⓪(BRA POINT⓪(⓪&EMPTY:⓪(TST D1⓪(BLE EM1⓪(CLR.B (A1)⓪&EM1:⓪(TST D2⓪(BLE EM2⓪(CLR.B (A2)⓪&EM2:⓪(⓪(MOVE (A7)+,D3⓪(UNLK A5⓪$END⓪"END SplitName;⓪ ⓪ PROCEDURE SplitPath ( REF source: ARRAY OF CHAR; VAR path, name: ARRAY OF CHAR );⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(⓪(MOVE.L -18(A3),A0 ; ADR (source)⓪(MOVE.L A0,A1⓪(MOVE.W -14(A3),D0 ; HIGH (source)⓪(MOVE.W D0,D2⓪(⓪(MOVE.L A1,D1⓪ len TST.B (A1)+⓪(DBEQ D2,len⓪(BNE cle⓪(SUBQ.L #1,A1⓪ cle SUBA.L D1,A1⓪(MOVE.W A1,D1⓪(BEQ ende0⓪(⓪&lupo:⓪(MOVE.B -1(A0,D1.W),D2⓪(CMPI.B #':',D2⓪(BEQ ende0⓪(CMPI.B #'\',D2⓪(BEQ ende0⓪(SUBQ #1,D1⓪(BNE lupo⓪&ende0:⓪(⓪(MOVE.L -12(A3),A1 ; ADR (path)⓪(MOVE.L -06(A3),A2 ; ADR (name)⓪(⓪(CMPA.L A2,A0⓪(BNE a2NotEqu⓪(JSR copyA0OnStack⓪(BRA a1NotEqu⓪&a2NotEqu⓪(CMPA.L A1,A0⓪(BNE a1NotEqu⓪(JSR copyA0OnStack⓪&a1NotEqu⓪(⓪(CLR.B (A1)⓪(CLR.B (A2)⓪(⓪(MOVEM.L D3-D7,-(A7)⓪(⓪(MOVE.W -08(A3),D5 ; HIGH (path)⓪(MOVE.W -(A3),D6 ; HIGH (name)⓪(SUBA.W #16,A3⓪(⓪(MOVE #1,-(A7) ; Flag: Bisher kein Überlauf⓪(⓪(MOVEQ #0,D2 ; source-counter⓪ l CMP D1,D2 ; pos erreicht ?⓪(BGE scnd⓪(CMP D0,D2 ; source geleert ?⓪(BHI err ; ja.⓪(CMP D5,D2⓪(BHI full⓪(MOVE.B (A0)+,(A1)+⓪ c BEQ err2⓪(ADDQ #1,D2⓪(BRA l⓪(⓪ full CLR (A7)⓪(TST.B (A0)+⓪(BRA c⓪(⓪ full2 TST D7⓪(BNE full3⓪(TST D3⓪(BNE ende⓪ full3 TST.B (A0)+⓪(BEQ ende⓪(⓪ err CMP D5,D2⓪(BHI err2⓪(CLR.B (A1)+ ; Endemarke bei dest1 setzen⓪(⓪ err2 CLR (A7)⓪(BRA ende⓪(⓪ scnd CMP D5,D2⓪(BHI scnd0⓪(CLR.B (A1)+ ; Endemarke bei dest1 setzen⓪ scnd0 MOVEQ #0,D4⓪(MOVEQ #0,D3 ; Flag f. prefix/suffix⓪(MOVEQ #8,D7⓪ l2 CMP D6,D4 ; dest2 voll ?⓪(BHI full2⓪(MOVE.B (A0)+,D1⓪(BEQ ende2⓪(CMPI.B #'.',D1⓪(BNE l22⓪(MOVEQ #0,D7⓪(TST D3⓪(BNE l22⓪(MOVEQ #1,D3⓪(MOVEQ #4,D7⓪ l22 TST D7⓪(BEQ l21⓪(SUBQ #1,D7⓪(MOVE.B D1,(A2)+⓪(ADDQ #1,D4⓪ l21 ADDQ #1,D2⓪(CMP D0,D2⓪(BLS l2⓪ ende2 CMP D6,D4⓪(BHI ende⓪(CLR.B (A2)+ ; Endemarke bei dest2 setzen⓪ ende⓪(TST.W (A7)+⓪(BNE ok⓪(TRAP #6⓪(DC.W StringOverflow⓪&ok:⓪(MOVEM.L (A7)+,D3-D7⓪(UNLK A5⓪$END⓪"END SplitPath;⓪ ⓪ PROCEDURE FileName ( REF filename: ARRAY OF CHAR ): NameStr;⓪"(*$L+*)⓪"VAR path: PathStr; name: NameStr;⓪"BEGIN⓪$SplitPath (filename, path, name);⓪$RETURN name⓪"END FileName;⓪"(*$L=*)⓪ ⓪ PROCEDURE FilePath ( REF filename: ARRAY OF CHAR ): PathStr;⓪"(*$L+*)⓪"VAR path: PathStr; name: NameStr;⓪"BEGIN⓪$SplitPath (filename, path, name);⓪$RETURN path⓪"END FilePath;⓪"(*$L=*)⓪ ⓪ PROCEDURE FilePrefix ( REF filename: ARRAY OF CHAR ): PfxStr;⓪"(*$L+*)⓪"VAR path: PathStr; name: NameStr; pfx: PfxStr; sfx: SfxStr;⓪"BEGIN⓪$SplitPath (filename, path, name);⓪$SplitName (name, pfx, sfx);⓪$RETURN pfx⓪"END FilePrefix;⓪"(*$L=*)⓪ ⓪ PROCEDURE FileSuffix ( REF filename: ARRAY OF CHAR ): SfxStr;⓪"(*$L+*)⓪"VAR path: PathStr; name: NameStr; pfx: PfxStr; sfx: SfxStr;⓪"BEGIN⓪$SplitPath (filename, path, name);⓪$SplitName (name, pfx, sfx);⓪$RETURN sfx⓪"END FileSuffix;⓪"(*$L=*)⓪ ⓪ PROCEDURE DriveToStr ( driveNo: Drive ): DriveStr;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE -(A3),D0⓪(BEQ DFT⓪(ADDI.B #$40,D0⓪(MOVE.B D0,(A3)+⓪(MOVE.B #':',(A3)+⓪(RTS⓪&DFT:⓪(CLR (A3)+⓪$END⓪"END DriveToStr;⓪ ⓪ PROCEDURE StrToDrive ( REF driveStr: ARRAY OF CHAR ): Drive;⓪"BEGIN⓪$ASSEMBLER⓪(CLR D0⓪(TST.W -(A3)⓪(MOVE.L -(A3),A0⓪(BEQ DFT⓪(TST.B (A0)⓪(BEQ DFT⓪(CMPI.B #':',1(A0)⓪(BNE DFT⓪(MOVE.B (A0),D0⓪(CMPI.B #'Z',D0⓪(BLS nolower⓪(SUBI.B #32,D0 ; change to lower case⓪&nolower⓪(SUBI.B #'A',D0⓪(BCS err⓪(ADDQ #1,D0⓪(CMPI.W #drvZ,D0⓪(BLS DFT⓪&err⓪(CLR D0⓪&DFT:⓪(MOVE D0,(A3)+⓪$END⓪"END StrToDrive;⓪ ⓪ PROCEDURE ValidatePath ( VAR path: ARRAY OF CHAR );⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -6(A3),-(A7)⓪(MOVE.W -2(A3),-(A7)⓪(JSR fileUpper⓪(MOVE.W (A7)+,D0⓪(MOVE.L (A7)+,A0⓪(TST.B (A0)⓪(BEQ e⓪&l TST.B (A0)+⓪(DBEQ D0,l⓪(BNE a⓪(SUBQ.L #1,A0⓪&a SUBQ.L #1,A0⓪(CMPI.B #':',(A0)⓪(BEQ e⓪(CMPI.B #'\',(A0)⓪(BEQ e⓪(TST.W D0⓪(BPL o⓪(; string ist schon voll!⓪(TRAP #6⓪(DC.W StringOverflow⓪(BRA e⓪&o BEQ f⓪(CLR.B 2(A0) ; wenn mit '\' nicht voll, NUL-Zeichen dran⓪&f MOVE.B #'\',1(A0)⓪&e⓪$END⓪"END ValidatePath;⓪"⓪ PROCEDURE PathValidated ( REF path: ARRAY OF CHAR ): PathStr;⓪"(*$L+*)⓪"VAR newpath: PathStr; ok: BOOLEAN;⓪"BEGIN⓪$Strings.Assign (path, newpath, ok);⓪$ValidatePath (newpath);⓪$RETURN newpath⓪"END PathValidated;⓪"(*$L=*)⓪ ⓪ ⓪ PROCEDURE NameUnique ( REF fileName: ARRAY OF CHAR ): BOOLEAN;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.W -(A3),D0⓪(MOVE.L -(A3),A0⓪(MOVEQ #'?',D1⓪(MOVEQ #'*',D2⓪&L TST.B (A0)⓪(BEQ T⓪(CMP.B (A0),D1⓪(BEQ F⓪(CMP.B (A0)+,D2⓪(BEQ F⓪(DBRA D0,L⓪&T MOVE #1,(A3)+⓪(RTS⓪&F CLR (A3)+⓪$END⓪"END NameUnique;⓪ ⓪ ⓪ PROCEDURE NameMatching ( REF fileName, wildcard: ARRAY OF CHAR ): BOOLEAN;⓪"BEGIN⓪$ASSEMBLER⓪((*⓪*MOVE.W -(A3),D1⓪*MOVE.L -(A3),A1 ; A1: wildcard⓪*MOVE.W -(A3),D0⓪*MOVE.L -(A3),A0 ; A0: filename⓪*TST.B 4(A0)⓪*BEQ F ; leerer filename ergibt FALSE⓪(*)⓪(LINK A5,#0⓪ ⓪(MOVE.L -12(A3),(A3)+⓪(MOVE.W -08(A3),(A3)+⓪(JSR fileUpper⓪(MOVE.L -06(A3),(A3)+⓪(MOVE.W -02(A3),(A3)+⓪(JSR fileUpper⓪ ⓪(MOVE.L -12(A3),A0⓪(TST.B (A0)⓪(BEQ.W F ; leerer filename ergibt FALSE⓪ ⓪(BRA C0⓪ ⓪%U0 ; Strings auf Stack löschen!⓪(MOVE.L (A7)+,D0⓪(CLR.L -(A7)⓪(CLR.L -(A7)⓪(CLR.W -(A7)⓪(MOVE.L A7,(A3)+ ; VAR pfx⓪(MOVE #8,(A3)+⓪(CLR.L -(A7)⓪(MOVE.L A7,(A3)+ ; VAR sfx⓪(MOVE #3,(A3)+⓪(MOVE.L D0,-(A7)⓪(JMP SplitName⓪ ⓪%C0 BSR U0⓪(BSR U0⓪(; Stack (alle Strings Null-terminiert):⓪(; 0(A7): sfx(filename)⓪(; 4(A7): pfx(filename)⓪(; 14(A7): sfx(wildcard)⓪(; 18(A7): pfx(wildcard)⓪ ⓪(LEA 18(A7),A0⓪(LEA 4(A7),A1⓪%L1 MOVE.B (A0)+,D0 ; Zeichen aus 'wildcard'⓪(BEQ E1 ; filename muß zu ende sein⓪(CMPI.B #'*',D0⓪(BEQ T1 ; filename ist egal⓪(CMP.B (A1)+,D0⓪(BEQ L1⓪(CMPI.B #'?',D0⓪(BEQ L1 ; zeichen ist egal⓪(BRA F⓪ ⓪%E1 TST.B (A1)⓪(BNE F⓪ ⓪%T1 LEA 14(A7),A0⓪(LEA (A7),A1⓪%L2 MOVE.B (A0)+,D0⓪(BEQ S1 ; filename muß zu ende sein⓪(CMPI.B #'*',D0⓪(BEQ T ; filename ist egal⓪(CMP.B (A1)+,D0⓪(BEQ L2⓪(CMPI.B #'?',D0⓪(BEQ L2 ; zeichen ist egal⓪(BRA F⓪ ⓪%S1 TST.B (A1)⓪(BNE F⓪ ⓪&T MOVE #1,(A3)+⓪(UNLK A5⓪(RTS⓪ ⓪&F CLR (A3)+⓪(UNLK A5⓪$END⓪"END NameMatching;⓪ ⓪ END FileNames.⓪ ə
- (* $FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$000020AC$FFECF05A$00002CAF$FFECF05A$00001E79$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05A$FFECF05AÇ$00000195T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$000002BD$0000015C$00000164$00000195$0000016B$000002B2$FFEE7904$0000275D$FFE2D09E$00000404$FFF13E0C$00000410$00000404$00001E79$000020AC$00001F6FÿÇé*)
-